package main

import (
	"context"
	"flag"
	"fmt"
	_ "net/http/pprof"
	"os"
	"os/signal"
	"pingbuqingyun_django/app/services/admin"
	"pingbuqingyun_django/app/svc"
	"syscall"
	"time"
)

//var configFile = flag.String("config", "etc/dev.yaml", "配置文件路径")

func main() {
	var (
		configPath string
		port       int
		initDb     bool
	)
	// 1. 读取配置文件路经
	flag.StringVar(&configPath, "cfg", "etc/dev.yaml", "配置文件路径")
	// 2. 读取端口信息
	flag.IntVar(&port, "port", 8380, "端口号")
	// 3. 是否读取初始化数据库信息,第一次初始化true，后续不需要改为false
	flag.BoolVar(&initDb, "setup", true, "初始化项目相关数据")
	flag.Parse()

	serSvc := svc.NewServiceContext(configPath)
	err := serSvc.BeforeStart()
	if err != nil {
		return
	}
	if initDb {
		// 初始化相关数据
		admin.MemberService.InitAdminUser(serSvc.Config.InitData.AdminUser)
	}

	addr := fmt.Sprintf("%s:%d", serSvc.Config.Host, port)

	// 后台协程启动gin服务
	go func() {
		err = serSvc.Server.Run(addr)
		if err != nil {
			return
		}
	}()

	// 后台协程监控系统负载情况

	// 优雅启停 使用signal来捕捉系统信号
	ctx, cancel := context.WithCancel(context.Background())
	// 监听系统信号
	signalChan := make(chan os.Signal, 1)
	signal.Notify(signalChan, syscall.SIGINT, syscall.SIGTERM)
	// 等待系统信号
	select {
	case sig := <-signalChan:
		fmt.Println("Received signal:", sig)
	case <-ctx.Done():
		fmt.Println("Context canceled")
	}

	// 停止 HTTP 服务器
	fmt.Println("正在关闭gin HTTP 服务 ...")
	ctx, cancel = context.WithTimeout(context.Background(), 10*time.Second)
	defer cancel()
	//if err := serSvc.Server.Re(ctx); err != nil {
	//	fmt.Println("HTTP server shutdown error:", err)
	//}
	fmt.Println("服务已经被关闭")

}

func init() {
	// 1. 初始化数据库的连接

	// 2. gin相关初始化
}
